rqnoj 675

给一串正整数,玩家每次可以从右边取一个数或者从左边取一个数,分数为取得整数的和,每次策略最优。问先手最多多少分,后手最多多少分。

博弈水题,主要是记忆化搜索。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

#include<bits/stdc++.h>//自行脑补头文件
#define mem(x,y) memset(x,y,sizeof(x))
using namespace std;
int w[110][110];
int a[110];
int sum[110];
int getw(int st,int ed)
{

if(st==ed)return w[st][ed]=a[st];
if(w[st][ed]!=-1)return w[st][ed];
int a=getw(st+1,ed),b=getw(st,ed-1);
return w[st][ed]=sum[ed]-sum[st-1]-min(a,b);
}
int main()
{

mem(w,-1);
int n;
scanf("%d",&n);
sum[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",a+i);
sum[i]=sum[i-1]+a[i];
}
int res1=getw(1,n),res2=sum[n]-res1;
printf("%d %d\n",res1,res2);
}

EOF